申請網址和之前設定Google登入驗證的地方相同
點選上方「啟用API和服務」
找到並點選「Youtube Data APIv3」
點選啟用
看到這個頁面就代表啟用成功囉,接下來要建造API Key
到建立憑證的地方建立API金鑰
幫API金鑰取一個名字,設定這把金鑰只用在Youtube Data API v3。
記下你的API Key~
我有在Dart Pub上找到別人寫好的Youtube api Package,既然都有現成的了,就不用像前幾天還要自己寫呼叫TMDb的api了。
順便把能播放Youtube影片的播放器package一起安裝吧。
詳細資訊請參考Package網址:
新增youtube資料夾,新增「youtube_repository.dart」。
程式碼如下:
import 'youtube_api_key.dart';
import 'package:youtube_api/youtube_api.dart';
class YoutubeRepository{
  final YoutubeAPI _youtubeAPI;
  YoutubeRepository({YoutubeAPI youtubeAPI})
    :_youtubeAPI = youtubeAPI ?? YoutubeAPI(youtube_api_key);
  Future<List> search({String keyWord}) async{
    return await _youtubeAPI.search(keyWord);
  }
}
由於複雜的部分(request、decode json...)別人都幫忙寫好了,這邊只要把搜尋關鍵字當作參數呼叫方法等結果回傳就可以了。
在youtube資料夾下新增「youtube_api_key」。
貼上剛剛取得的api key即可。
const String youtube_api_key = 'your_api_key';
已經是第5個實作的bloc了,相信你已經足夠熟悉Bloc Pattern,而且Youtube Bloc超級簡單只需一個Search Event,所以你可以先試著自己寫看看再參考我的程式碼喔。
在youtube資料夾中新增一個「bloc」資料夾,使用bloc generator產生youtubeBloc模板。
fluttube
└───lib
│   └───login
│   └───movie
│   └───register
│   └───youtube
│   │   └───bloc
│   │   │   └───bloc.dart
│   │   │   └───youtube_bloc.dart
│   │   │   └───youtube_event.dart
│   │   │   └───youtube_state.dart
│   │   └───youtube_api_key.dart
│   │   └───youtube_repository.dart
│     ...
│
import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';
import 'package:youtube_api/youtube_api.dart';
@immutable
abstract class YoutubeState extends Equatable {
  YoutubeState([List props = const []]) : super(props);
}
class YoutubeInitialState extends YoutubeState {
  @override
  String toString() => 'YoutubeInitialState';
}
class YoutubeLoadingState extends YoutubeState {
  @override
  String toString() => 'YoutubeLoadingState';
}
class YoutubeFailedState extends YoutubeState {
  @override
  String toString() => 'YoutubeFailedState';
}
class YoutubeSuccessState extends YoutubeState {
  final List<YT_API> ytResult;
  YoutubeSuccessState(this.ytResult) : super([ytResult]);
  @override
  String toString() => 'YoutubeSuccessState';
}
final List<YT_API> ytResult;中的「YT_API」是包含在youtube_api套件中的類別,雖然名字取的很醜,不過能省去我們自己定義的時間,就將就著用吧。
import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';
@immutable
abstract class YoutubeEvent extends Equatable {
  YoutubeEvent([List props = const []]) : super(props);
}
class SearchYoutubeEvent extends YoutubeEvent {
  final keyWord;
  SearchYoutubeEvent(this.keyWord) : super([keyWord]);
  @override
  String toString() => 'Search $keyWord on Youtube';
}
import 'dart:async';
import 'package:bloc/bloc.dart';
import '../youtube.dart';
class YoutubeBloc extends Bloc<YoutubeEvent, YoutubeState> {
  YoutubeRepository _youtubeRepository;
  YoutubeBloc({YoutubeRepository youtubeRepository})
      : assert(youtubeRepository != null),
        _youtubeRepository = youtubeRepository;
  @override
  YoutubeState get initialState => YoutubeInitialState();
  @override
  Stream<YoutubeState> mapEventToState(
    YoutubeEvent event,
  ) async* {
    if (event is SearchYoutubeEvent) {
      yield* _mapSearchToState(event.keyWord);
    }
  }
  Stream<YoutubeState> _mapSearchToState(String keyWord) async* {
    try {
      yield YoutubeLoadingState();
      final ytResult  = await _youtubeRepository.search(keyWord: keyWord);
      yield YoutubeSuccessState(ytResult);
    } catch (_) {
      yield YoutubeFailedState();
    }
  }
}
在youtube資料夾內,新增youtube.dart
貼上以下程式碼:
export 'bloc/bloc.dart';
export 'youtube_repository.dart';
我想今天就在完成YoutubeBloc這邊先告一個段落,如果你覺得youtube_api套件提供的功能太少,你也可以自己寫一個去和Youtube Server溝通,實作步驟和movie_api_provider是差不多的。
明天和後天會設計電影細節頁面以及播放Youtube影片的視窗。
完整程式碼在這裡-> FlutTube Github